﻿using System;
using System.Collections.Generic;

using System.Text;

namespace Rance.Battle
{
    class 剑士AI : AI
    {
        public override AIResult Excute(角色 角色, 队伍状况 队伍状况, AI技能MGT 技能mgt)
        {
            AIResult result = new AIResult();

            //优先使用剑魂
            if (角色.行动点 >= 2 && 队伍状况.战场.剩余回合数 >= 10 && 技能mgt.Has("剑魂") && 角色.攻击赋予 == null )
            {
                var 剑魂 = 技能mgt.Get("剑魂");
                result.Action = 剑魂.Name;
                result.TargetList.Add(角色);

                return result;
            }

            if (技能mgt.Has("新月斩"))
            {
                int 几率 = 0;
                switch (角色.行动点)
                { 
                    case 1:
                        几率 = 100;
                        break;
                    case 2:
                        几率 = 50;
                        break;
                    case 3:
                        几率 = 20;
                        break;
                }

                int 兵力比率 = 角色.兵力 * 100 / 角色.最大兵力;
                if(兵力比率 <= 20)
                    几率 += 80;
                else if (兵力比率 <= 40)
                    几率 += 50;
                else if (兵力比率 <= 60)
                    几率 += 20;

                if (队伍状况.战场.AI乱数表.Hit(几率))
                {
                    var 新月斩 = 技能mgt.Get("新月斩");
                    var 新月斩target = GetTarget(ConvertSoloTarget(新月斩.TargetList), 队伍状况);
                    result.Action = 新月斩.Name;
                    result.TargetList.Add(新月斩target);

                    return result;
                }
            }
            
            //使用攻击技能
            var 技能list = 技能mgt.GetBy行动点(2);
            foreach (var item in 技能list.ToArray())
            {
                if (item.Name == "新月斩")
                    技能list.Remove(item);
            }

            if (技能list.Count > 0)
            {
                int rate = 0;

                switch (角色.行动点)
                {
                    case 1:
                        break;
                    case 2:
                        rate = 60;
                        break;
                    case 3:
                        rate = 85;
                        break;
                    default:
                        rate = 100;
                        break;
                }

                bool hit = false;
                if (rate == 100)
                    hit = true;
                else if (rate > 0)
                    hit = 队伍状况.战场.AI乱数表.Hit(rate);

                if (hit)
                {
                    result.Action = 技能list[0].Name;
                    result.TargetList = 技能list[0].TargetList[0].List;

                    return result;
                }
            }

            var 斩击 = 技能mgt.Get("斩击");
            if (斩击 == null)
                return null;
            var 斩击target = GetTarget(ConvertSoloTarget(斩击.TargetList), 队伍状况);
            result.Action = 斩击.Name;
            result.TargetList.Add(斩击target);

            return result;
        }


        protected virtual 角色 GetTarget(List<角色> targetList, 队伍状况 队伍状况)
        {
            //优先攻击"准备中"的敌人
            List<角色> tempList = targetList.FindAll(r => r.是否准备);
            if (tempList.Count == 1)
                return targetList[0];
            else if (tempList.Count > 1)
            {
                var value = 队伍状况.战场.AI乱数表.Random(0, tempList.Count);
                return tempList[value];
            }

            //撇除"步卒"敌人
            tempList.Clear();
            foreach (var item in targetList)
            {
                if (item.兵种.类型 == "步卒")
                    continue;

                tempList.Add(item);
            }

            if (tempList.Count != 0)
                targetList = tempList;

            if (targetList.Count == 1)
                return targetList[0];
            else
            {
                var value = 队伍状况.战场.AI乱数表.Random(0, targetList.Count);
                return targetList[value];
            }
        }

        private static 剑士AI instance = new 剑士AI();
        public static 剑士AI GetInstance()
        {
            return instance;
        }
    }
}
